<?php
/***************************************************************************
 * 
 * Copyright (c) 2010 , Inc. All Rights Reserved
 * $Id$ 
 * 
 **************************************************************************/

/**
 * @file ValidationFunc.php
 * @author niulei(niulei@)
 * @date 2010/05/17 18:58:28
 * @version $Revision$ 
 * @brief 
 *  
 **/
require_once 'address/Address.php';

final class ValidationFunc {
	/**
	 * string_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>1,//最小
	 *                              'max_range'=>2,//最大
	 *                              'value_array'=>array('test1','test2','test3'),//可选值
	 *                              'encode'=>'gbk'|'utf-8',//可选编码，不设置按gbk处理
	 *                              'reg_exp'=>[可输入一个PHP支持的正则表达式],
	 *                              'length_array'=>array(2,3,5),//可选长度值
	 *                              'byte_length'=>true|false,//是否按字节长度处理，不设置不采用字节长度处理
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function string_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} elseif (isset ( $arr_option ['min_range'] ) && $arr_option ['min_range'] == 0) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		
		if (is_array ( $arr_option )) {
			if (! ValidationFuncRef::valid_str_length ( $str, $arr_option )) {
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
				return false;
			}
			if (isset ( $arr_option ['value_array'] )) {
				if (! ValidationFuncRef::valid_value ( $str, $arr_option ['value_array'], $flag )) {
					$validate_res = "$func error:" . Validation::FAIL_VALUE;
					return false;
				}
			}
			if (isset ( $arr_option ['encode'] )) {
				$encode_in = $arr_option ['encode'];
				if (strcasecmp ( $encode_in, 'gbk' ) != 0 && strcasecmp ( $encode_in, 'utf-8' ) != 0) {
					$validate_res = "$func error:" . Validation::FAIL_ENCODE;
					return false;
				}
				if (! ValidationFuncRef::valid_encode ( $str, $encode_in )) {
					$validate_res = "$func error:" . Validation::FAIL_ENCODE;
					return false;
				}
			}
			
			if (isset ( $arr_option ['reg_exp'] )) {
				if (! ValidationFuncRef::valid_format ( $str, $arr_option ['reg_exp'] )) {
					$validate_res = "$func error:" . Validation::FAIL_REGEXP;
					return false;
				}
			}
		}
		if (! ValidationFuncRef::valid_content ( $str, $flag )) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		return true;
	}
	
	/**
	 * float_validation用户选择指定的规则对输入进行校验
	 * 
	 * @param string $float 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>1111.11,//最小
	 *                              'max_range'=>2222.22,//最大
	 *                              'decimal'=>3,//小数后精确位数
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function float_validation($float, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $float )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		$pattern = '/^[0-9,+-]*[.]{1}$/';
		if (true === ValidationFuncRef::valid_format ( $float, $pattern )) {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		}	
		
		$alt_pattern = '/^[.]{1}[0-9]{0,2}$/';
		$pattern = '/^[0-9,+-]*[.]{0,1}[0-9]{0,2}$/';
		$b_has_max_value = false;
		$b_has_max_range = false;
		$b_has_min_value = false;
		if (is_array ( $arr_option )) {
			if (isset ( $arr_option ['max_range'] )) {
				if (isset ( $arr_option ['min_range'] )) {
					$b_has_max_range = true;
				} else {
					$b_has_max_value = true;
				}
			} elseif (isset ( $arr_option ['min_range'] )) {
				$b_has_min_value = true;
			}
			if (isset ( $arr_option ['decimal'] )) {
				$pattern = '/^[0-9,+-]*[.]{0,1}[0-9]{0,' . $arr_option ['decimal'] . '}$/';
				$alt_pattern = '/^[.]{1}[0-9]{0,' . $arr_option ['decimal'] . '}$/';
			}
		}
	    if (true === ValidationFuncRef::valid_format ( $float, $alt_pattern )) {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		}
		
		if (false === ValidationFuncRef::valid_format ( $float, $pattern )) {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		}
		
		$flag += Validation::FLAG_OFFSET;
		$ret_f = filter_var ( $float, FILTER_VALIDATE_FLOAT, $flag );
		if (false === $ret_f) {
			$validate_res = "$func error:" . Validation::FAIL_THOUSAND;
			return false;
		}
		
		if ($b_has_max_range) {
			if ($float > $arr_option ['max_range'] || $float < $arr_option ['min_range']) {
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
				return false;
			}
		} elseif ($b_has_max_value) {
			if ($float > $arr_option ['max_range']) {
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
				return false;
			}
		} elseif ($b_has_min_value) {
			if ($float < $arr_option ['min_range']) {
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
				return false;
			}
		}
		return true;
	}
	
	/**
	 * int_validation用户选择指定的规则对输入进行校验
	 * 
	 * @param string $int 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>-1111,//最小
	 *                              'max_range'=>2222,//最大
	 *                              'value_array'=>array(1,2,3),//可选整数
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function int_validation($int, $arr_option = null, $flag = null, $func, &$validate_res) {
		$b_has_max_value = false;
		$b_has_min_value = false;
		$b_has_value_arr = false;
		$input_option = null;
		if (ValidationFuncRef::input_empty ( $int )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		if (is_array ( $arr_option )) {
			if (isset ( $arr_option ['max_range'] )) {
				if (isset ( $arr_option ['min_range'] )) {
					$input_option = array ('options' => array ('max_range' => $arr_option ['max_range'], 'min_range' => $arr_option ['min_range'] ) );
				} else {
					$b_has_max_value = true;
				}
			} elseif (isset ( $arr_option ['min_range'] )) {
				$b_has_min_value = true;
			}
			if (isset ( $arr_option ['value_array'] )) {
				$b_has_value_arr = true;
			}
		}
		
		$ret_i = filter_var ( $int, FILTER_VALIDATE_INT, $input_option );
		if (false === $ret_i) {
			$validate_res = "$func error:" . Validation::FAIL_LENGTH;
			return false;
		}
		
		if ($b_has_max_value) {
			if ($int > $arr_option ['max_range']) {
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
				return false;
			}
		} elseif ($b_has_min_value) {
			if ($int < $arr_option ['min_range']) {
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
				return false;
			}
		}
		
		if ($b_has_value_arr) {
			if (! in_array ( $int, $arr_option ['value_array'] )) {
				$validate_res = "$func error:" . Validation::FAIL_VALUE;
				return false;
			}
		}
		return true;
	}
	
	/**
	 * number_validation用户选择指定的规则对输入进行校验
	 * 
	 * @param string $int 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>11,//最小
	 *                              'max_range'=>22,//最大
	 *                              'value_array'=>array(1,2,3),//可选整数
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function number_validation($number, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (false === self::int_validation ( $number, $arr_option, $flag, $func, $validate_res )) {
			return false;
		}
		
		if (false === ValidationFuncRef::is_number ( $number )) {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		}
		return true;
	}
	
	/**
	 * string_unhtml_validation用户选择指定的规则对输入进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>1,//最小长度
	 *                              'max_range'=>2,//最大长度
	 *                              'value_array'=>array('test1','test2','test3'),//可选值
	 *                              'encode'=>'gbk'|'utf-8',//可选编码，不设置按gbk处理
	 *                              'length_array'=>array(2,3,5),//可选长度值
	 *                              'byte_length'=>true|false,//是否按字节长度处理，不设置不采用字节长度处理
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function string_unhtml_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		$html_elem = '/^[^<>]*$/';
		$arr_option ['reg_exp'] = $html_elem;
		$flag = $flag | Validation::FLAG_ALLOW_HIGH;
		return self::string_validation ( $str, $arr_option, $flag, $func, $validate_res );
	}
	
	/**
	 * string_single_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>1,//最小
	 *                              'max_range'=>2,//最大
	 *                              'value_array'=>array('test1','test2','test3'),//可选值
	 *                              'encode'=>'gbk'|'utf-8',//可选编码，不设置按gbk处理
	 *                              'reg_exp'=>[可输入一个PHP支持的正则表达式],
	 *                              'length_array'=>array(2,3,5),//可选长度值
	 *                              'byte_length'=>true|false,//是否按字节长度处理，不设置不采用字节长度处理
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function string_single_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		$flag = $flag | Validation::FLAG_ALLOW_HIGH;
		return self::string_validation ( $str, $arr_option, $flag, $func, $validate_res );
	}
	
	/**
	 * string_multi_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>1,//最小
	 *                              'max_range'=>2,//最大
	 *                              'value_array'=>array('test1','test2','test3'),//可选值
	 *                              'encode'=>'gbk'|'utf-8',//可选编码，不设置按gbk处理
	 *                              'reg_exp'=>[可输入一个PHP支持的正则表达式],
	 *                              'length_array'=>array(2,3,5),//可选长度值
	 *                              'byte_length'=>true|false,//是否按字节长度处理，不设置不采用字节长度处理
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function string_multi_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		$flag = $flag | Validation::FLAG_ALLOW_HIGH | Validation::FLAG_ALLOW_ENTER;
		return self::string_validation ( $str, $arr_option, $flag, $func, $validate_res );
	}
	
	/**
	 * idnum_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function idnum_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		
		if(preg_match ( "/^[0-9]{15}$/D", $str )){
		    if (ValidationFuncRef::valid_birth($str)){
				return true;
			}else{
				$validate_res = "$func error:" . Validation::FAIL_CONTENT;
				return false;
			}
		}

		if (preg_match ( "/^[0-9]{17}[0-9xX]$/D", $str )) {
			$wi = array (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 );
			$checkCode = array ('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' );
			$sum = 0;
			for($i = 0; $i < 17; $i ++) {
				$ai = intval ( substr ( $str, $i, 1 ) );
				$sum += $ai * $wi [$i];
			}
			if ($checkCode [$sum % 11] == substr ( $str, - 1, 1 )){
			    if (ValidationFuncRef::valid_birth($str)){
				    return true;
			    }else{
				    $validate_res = "$func error:" . Validation::FAIL_CONTENT;
				    return false;
			    }
			}
			else {
				$validate_res = "$func error:" . Validation::FAIL_CONTENT;
				return false;
			}
		} else {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		}
	}
	
	/**
	 * name_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>1,//最小
	 *                              'max_range'=>2,//最大
	 *                              'value_array'=>array('test1','test2','test3'),//可选值
	 *                              'encode'=>'gbk'|'utf-8',//可选编码，不设置按gbk处理
	 *                              'length_array'=>array(2,3,5),//可选长度值
	 *                              'byte_length'=>true|false,//是否按字节长度处理，不设置不采用字节长度处理
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function name_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} elseif (isset ( $arr_option ['min_range'] ) && $arr_option ['min_range'] == 0) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		//检查是否存在非法字符
		if (! ValidationFuncRef::valid_letter ( $str )) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		//不检查汉字，不检查低字节字符，不检查正则式
		$flag = $flag | Validation::FLAG_ALLOW_HIGH | Validation::FLAG_ALLOW_LOW;
		if (isset ( $arr_option ['reg_exp'] )) {
			unset ( $arr_option ['reg_exp'] );
		}
		return self::string_validation ( $str, $arr_option, $flag, $func, $validate_res );
	}
	
	/**
	 * email_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function email_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		
		//判断是否存在回车
		if (strpos ( $str, "\n" ) !== false) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		$local_part_pos = strpos ( $str, '@' );
		//找不到@，或者@开头，返回false
		if ($local_part_pos == false) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		$str_local_part = substr ( $str, 0, $local_part_pos );
		$str_len = strlen ( $str_local_part );
		
		if ($str_len > 64) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		$str_domain_name = substr ( $str, $local_part_pos + 1 );
		$str_len = strlen ( $str_domain_name );
		if ($str_len == 0 || $str_len > 255) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		
		if (filter_var ( $str, FILTER_VALIDATE_EMAIL ) === false) {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		} else {
			return true;
		}
	}
	
	/**
	 * tel_no_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param string $arr_option  输入预定义的校验规则
	 *         $arr_option = array(
	 *                              'min_range'=>1,//最小
	 *                              'max_range'=>2,//最大
	 *                              'encode'=>'gbk'|'utf-8',//可选编码，不设置按gbk处理
	 *                              'length_array'=>array(2,3,5),//可选长度值
	 *                              'byte_length'=>true|false,//是否按字节长度处理，不设置不采用字节长度处理
	 *                            )
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function tel_no_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} elseif (isset ( $arr_option ['min_range'] ) && $arr_option ['min_range'] == 0) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		
		if (is_array ( $arr_option )) {
			if (! ValidationFuncRef::valid_str_length ( $str, $arr_option )) {
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
				return false;
			}
		}
		$pattern = '/^[0-9]+([-][0-9]+)*$/';
		if (false === ValidationFuncRef::valid_format ( $str, $pattern )) {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		} else {
			return true;
		}
	}
	
	/**
	 * address_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $arr_address 输入的要校验的数据
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function address_validation($arr_address, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (! is_array ( $arr_address ) || ! isset ( $arr_address ['province'] )) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		if (! self::address_level1_validation ( $arr_address ['province'], null, null, $func, $validate_res )) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		
		if (isset ( $arr_address ['city'] )) {
			if (! isset ( $arr_address ['country'] ) || $arr_address ['country'] == AddressLevel1::OTHER_PLACE) {
				if (! self::address_level2_validation ( $arr_address ['province'] . $arr_address ['city'], null, null, $func, $validate_res )) {
					$validate_res = "$func error:" . Validation::FAIL_CONTENT;
					return false;
				}
			} else { //三级地址
				if (! self::address_level3_validation ( $arr_address ['province'] . $arr_address ['city'] . $arr_address ['country'], null, null, $func, $validate_res )) {
					$validate_res = "$func error:" . Validation::FAIL_CONTENT;
					return false;
				}
			}
		} elseif (isset ( $arr_address ['country'] )) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		
		return true;
	}
	
	/**
	 * address_level1_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function address_level1_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		if (Address::isAddressLevel1Exist ( $str )) {
			return true;
		} else {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
	}
	
	/**
	 * address_level2_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function address_level2_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		if (Address::isAddressLevel2Exist ( $str )) {
			return true;
		} else {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
	}
	
	/**
	 * address_level3_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function address_level3_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		if (Address::isAddressLevel3Exist ( $str )) {
			return true;
		} else {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
	}
	
	/**
	 * birthday_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function birthday_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		$str = str_replace ( '-', '', $str );
		if (! is_numeric ( $str ) || strlen ( $str ) != 8 || false === strtotime ( $str )) {
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		$birth_year  = substr($str, 0,  4);
		$birth_month = substr($str, 4, 2);
		$birth_day   = substr($str, 6, 2);
		$input_time_stamp = mktime(0,0,0, $birth_month, $birth_day, $birth_year);
		$stand_date = date('Y-m-d', $input_time_stamp);
		$input_date = $birth_year . '-' . $birth_month . '-' .$birth_day;
		if ($input_date != $stand_date){
			$validate_res = "$func error:" . Validation::FAIL_CONTENT;
			return false;
		}
		
		if(isset($arr_option['min_range'])){
			$min_range = $arr_option['min_range'];
			$min_range = str_replace ( '-', '', $min_range );
			if (! is_numeric ( $min_range ) || strlen ( $min_range ) != 8 || false === strtotime ( $min_range )) {
			    $validate_res = "$func error:" . Validation::FAIL_CONTENT;
			    return false;
		    }
		    $min_birth_year  = substr($min_range, 0,  4);
		    $min_birth_month = substr($min_range, 4, 2);
		    $min_birth_day   = substr($min_range, 6, 2);
		    $min_input_time_stamp = mktime(0,0,0, $min_birth_month, $min_birth_day, $min_birth_year);
		    $min_stand_date = date('Y-m-d', $min_input_time_stamp);
		    $min_date = $min_birth_year . '-' . $min_birth_month . '-' .$min_birth_day;
		    if ($min_date != $min_stand_date){
			    $validate_res = "$func error:" . Validation::FAIL_CONTENT;
			    return false;
		    }
		    if( $input_time_stamp < $min_input_time_stamp ){
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
			    return false;
			}
		}
		if(isset($arr_option['max_range'])){
			$max_range = $arr_option['max_range'];
			$max_range = str_replace ( '-', '', $max_range );
			if (! is_numeric ( $max_range ) || strlen ( $max_range ) != 8 || false === strtotime ( $max_range )) {
			    $validate_res = "$func error:" . Validation::FAIL_CONTENT;
			    return false;
		    }
		    $max_birth_year  = substr($max_range, 0,  4);
		    $max_birth_month = substr($max_range, 4, 2);
		    $max_birth_day   = substr($max_range, 6, 2);
		    $max_input_time_stamp = mktime(0,0,0, $max_birth_month, $max_birth_day, $max_birth_year);
		    $max_stand_date = date('Y-m-d', $max_input_time_stamp);
		    $max_date = $max_birth_year . '-' . $max_birth_month . '-' .$max_birth_day;
		    if ($max_date != $max_stand_date){
			    $validate_res = "$func error:" . Validation::FAIL_CONTENT;
			    return false;
		    }
		    if( $input_time_stamp > $max_input_time_stamp ){
				$validate_res = "$func error:" . Validation::FAIL_LENGTH;
			    return false;
			}
		}
		return true;
	}
	
	/**
	 * phone_no_validation用户选择指定的规则对输入字符串进行校验
	 * 
	 * @param string $str 输入的要校验的数据
	 * @param array  $flag 校验选项，必须为已预定义选项
	 * @access public
	 * @return bool
	 *         true :校验通过
	 *         false:校验不通过
	 */
	static function phone_no_validation($str, $arr_option = null, $flag = null, $func, &$validate_res) {
		if (ValidationFuncRef::input_empty ( $str )) {
			if ($flag & Validation::FLAG_ALLOW_EMPTY) {
				return true;
			} else {
				$validate_res = "$func error:" . Validation::FAIL_EMPTY;
				return false;
			}
		}
		$pattern = "/^(13|15|18|14)\d{9}$/";
		if (false === ValidationFuncRef::valid_format ( $str, $pattern )) {
			$validate_res = "$func error:" . Validation::FAIL_REGEXP;
			return false;
		}
		return true;
	}
	
	static function checkValidationFunc($func) {
		foreach ( Validation::$VALIDATION_FUNC_ARRAY as $func_name => $is_online ) {
			if ($func === $func_name && 1 == $is_online) {
				return true;
			}
		}
		return false;
	}
	
	static function checkValidationFlag($arr_flag) {
		if (is_array ( $arr_flag )) {
			if (empty ( $arr_flag ))
				return true;
			foreach ( $arr_flag as $flag ) {
				if (! isset ( Validation::$FLAG_INPUT_ARRAY [$flag] ))
					return false;
			}
			return true;
		} else {
			if (isset ( Validation::$FLAG_INPUT_ARRAY [$arr_flag] ))
				return true;
			else
				return false;
		}
	}

}
